home *** CD-ROM | disk | FTP | other *** search
/ PC Pro 1997 December / PC Pro December 1997 CD-Rom coverdisc.iso / symantec / dbAnywh / JAVA.BIN / CLASSES.ZIP / sun / tools / tree / FinallyStatement.class (.txt) < prev    next >
Encoding:
Java Class File  |  1996-12-14  |  3.7 KB  |  131 lines

  1. package sun.tools.tree;
  2.  
  3. import java.io.PrintStream;
  4. import java.util.Hashtable;
  5. import sun.tools.asm.Assembler;
  6. import sun.tools.asm.CatchData;
  7. import sun.tools.asm.Label;
  8. import sun.tools.asm.TryData;
  9. import sun.tools.java.ClassDefinition;
  10. import sun.tools.java.CompilerError;
  11. import sun.tools.java.Environment;
  12. import sun.tools.java.Identifier;
  13. import sun.tools.java.Type;
  14.  
  15. public class FinallyStatement extends Statement {
  16.    Statement body;
  17.    Statement finalbody;
  18.    boolean finallyFinishes;
  19.  
  20.    public FinallyStatement(int var1, Statement var2, Statement var3) {
  21.       super(103, var1);
  22.       this.body = var2;
  23.       this.finalbody = var3;
  24.    }
  25.  
  26.    long check(Environment var1, Context var2, long var3, Hashtable var5) {
  27.       var3 = ((Statement)this).reach(var1, var3);
  28.       CheckContext var6 = new CheckContext(var2, this);
  29.       long var7 = this.body.check(var1, var6, var3, var5) & var6.vsBreak;
  30.       CheckContext var9 = new CheckContext(var2, this);
  31.       long var10 = this.finalbody.check(var1, var9, var3, var5) & var9.vsBreak;
  32.       this.finallyFinishes = (var10 & Statement.DEAD_END) == 0L;
  33.       if (!this.finallyFinishes) {
  34.          var5.clear();
  35.       }
  36.  
  37.       return var2.removeAdditionalVars(var7 | var10);
  38.    }
  39.  
  40.    public Statement inline(Environment var1, Context var2) {
  41.       if (this.body != null) {
  42.          this.body = this.body.inline(var1, var2);
  43.       }
  44.  
  45.       if (this.finalbody != null) {
  46.          this.finalbody = this.finalbody.inline(var1, var2);
  47.       }
  48.  
  49.       if (this.body == null) {
  50.          return ((Statement)this).eliminate(var1, this.finalbody);
  51.       } else {
  52.          return (Statement)(this.finalbody == null ? ((Statement)this).eliminate(var1, this.body) : this);
  53.       }
  54.    }
  55.  
  56.    public Statement copyInline(Context var1, boolean var2) {
  57.       throw new CompilerError("copyInline");
  58.    }
  59.  
  60.    public void code(Environment var1, Context var2, Assembler var3) {
  61.       var2 = new Context(var2, (Node)null);
  62.       Integer var4 = null;
  63.       Integer var5 = null;
  64.       Label var6 = null;
  65.       if (this.finallyFinishes) {
  66.          ClassDefinition var9 = var2.field.getClassDefinition();
  67.          LocalField var7 = new LocalField(super.where, var9, 0, Type.tObject, (Identifier)null);
  68.          LocalField var8 = new LocalField(super.where, var9, 0, Type.tInt, (Identifier)null);
  69.          var4 = new Integer(var2.declare(var1, var7));
  70.          var5 = new Integer(var2.declare(var1, var8));
  71.          var6 = new Label();
  72.       }
  73.  
  74.       TryData var12 = new TryData();
  75.       var12.add((Object)null);
  76.       CodeContext var13 = new CodeContext(var2, this);
  77.       var3.add(super.where, -3, var12);
  78.       this.body.code(var1, var13, var3);
  79.       var3.add(var13.breakLabel);
  80.       var3.add(var12.getEndLabel());
  81.       if (this.finallyFinishes) {
  82.          var3.add(super.where, 168, var13.contLabel);
  83.          var3.add(super.where, 167, var6);
  84.       } else {
  85.          var3.add(super.where, 167, var13.contLabel);
  86.       }
  87.  
  88.       CatchData var14 = var12.getCatch(0);
  89.       var3.add(var14.getLabel());
  90.       if (this.finallyFinishes) {
  91.          var3.add(super.where, 58, var4);
  92.          var3.add(super.where, 168, var13.contLabel);
  93.          var3.add(super.where, 25, var4);
  94.          var3.add(super.where, 191);
  95.       } else {
  96.          var3.add(super.where, 87);
  97.       }
  98.  
  99.       CodeContext var10 = new CodeContext(var2, this);
  100.       var3.add(var13.contLabel);
  101.       if (this.finallyFinishes) {
  102.          var3.add(super.where, 58, var5);
  103.       }
  104.  
  105.       this.finalbody.code(var1, var2, var3);
  106.       var3.add(var10.breakLabel);
  107.       if (this.finallyFinishes) {
  108.          var3.add(super.where, 169, var5);
  109.          var3.add(var6);
  110.       }
  111.  
  112.    }
  113.  
  114.    public void print(PrintStream var1, int var2) {
  115.       super.print(var1, var2);
  116.       var1.print("try ");
  117.       if (this.body != null) {
  118.          this.body.print(var1, var2);
  119.       } else {
  120.          var1.print("<empty>");
  121.       }
  122.  
  123.       var1.print(" finally ");
  124.       if (this.finalbody != null) {
  125.          this.finalbody.print(var1, var2);
  126.       } else {
  127.          var1.print("<empty>");
  128.       }
  129.    }
  130. }
  131.